package com.zcyh.exam.constants.defal;

/**
 * @author timo 2021/3/29
 */

import com.zcyh.exam.constants.EnumConstants;

import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * Created by Tyler on 2017/6/5.
 */
@SuppressWarnings({"unchecked"})
public class EnumHelper {

    /**
     * 获取枚举集合
     *
     * Enum
     *
     * @param <T>
     * @return List<EnumItem>
     */
    public static <T extends EnumConstants.IEnum> List<EnumItem> getEnumList(
            Class<? extends EnumConstants.IEnum> enumClass) {
        T[] q = (T[]) enumClass.getEnumConstants();
        List<EnumItem> v = Arrays.stream(q).map(T::getEnumItem).collect(Collectors.toList());
        return v;
    }

    /**
     * 根据字符串，动态获取枚举值
     * @param enumName
     * @param <T>
     * @return
     * @throws ClassNotFoundException
     */
    public static <T extends EnumConstants.IEnum> List<EnumItem> getEnumList(
            String enumName)
            throws ClassNotFoundException {
        Class enumClass= Class.forName(EnumConstants.class.getName()+"$"+enumName);
        return getEnumList(enumClass);
    }



    /**
     * 根据枚举类型和key获取信息
     *
     * @param enumClass
     *            Enum
     * @param key
     *            Enum key
     * @param <T>
     * @return EnumItem
     */
    public static <T extends EnumConstants.IEnum> EnumItem getEnumItem(Class<? extends EnumConstants.IEnum> enumClass,
                                                                     Integer key) {
        T[] q = (T[]) enumClass.getEnumConstants();
        Optional<T> v = (Arrays.stream(q)).filter(x -> x.getEnumItem().getItemKey() == key).findFirst();
        if (v.equals(Optional.empty())){
            return null;
        }
        T r = v.get();
        EnumItem s = r.getEnumItem();
        return s;
    }

    /**
     * 根据枚举类型和value获取信息
     * @param enumClass
     *            Enum
     * @param value
     *            Enum value
     * @param <T>
     * @return EnumItem
     */
    public static <T extends EnumConstants.IEnum> EnumItem getEnumItem(Class<? extends EnumConstants.IEnum> enumClass,
                                                                     final String value) {
        T[] q = (T[]) enumClass.getEnumConstants();
        Optional<T> v = (Arrays.stream(q)).filter(x -> x.getEnumItem().getItemValue().equals(value)).findFirst();
        if (v.equals(Optional.empty())){
            return null;
        }
        T r = v.get();
        EnumItem s = r.getEnumItem();
        return s;
    }

}
